//在本问题中, 树指的是一个连通且无环的无向图。 
//
// 输入一个图，该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间，这条附加的边不属
//于树中已存在的边。 
//
// 结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ，满足 u < v，表示连接顶点u 和v的无向图的边。 
//
// 返回一条可以删去的边，使得结果图是一个有着N个节点的树。如果有多个答案，则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。
// 
//
// 示例 1： 
//
// 输入: [[1,2], [1,3], [2,3]]
//输出: [2,3]
//解释: 给定的无向图为:
//  1
// / \
//2 - 3
// 
//
// 示例 2： 
//
// 输入: [[1,2], [2,3], [3,4], [1,4], [1,5]]
//输出: [1,4]
//解释: 给定的无向图为:
//5 - 1 - 2
//    |   |
//    4 - 3
// 
//
// 注意: 
//
// 
// 输入的二维数组大小在 3 到 1000。 
// 二维数组中的整数在1到N之间，其中N是输入数组的大小。 
// 
//
// 更新(2017-09-26): 
//我们已经重新检查了问题描述及测试用例，明确图是无向 图。对于有向图详见冗余连接II。对于造成任何不便，我们深感歉意。 
// Related Topics 树 并查集 图 
// 👍 282 👎 0
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    int Find_Set(vector<int>& parent,int index){
        if (parent[index] != index){
            parent[index] = Find_Set(parent,parent[index]);
        }
        return parent[index];
    }
    void Union_Set(vector<int>& parent ,int index1,int index2){
        int findIndex1 = Find_Set(parent,index1);
        int findIndex2 = Find_Set(parent,index2);
        parent[findIndex1] = findIndex2;
    }
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        vector<int> parent(edges.size()+1);
        vector<int> res;

        for (int i = 1; i <= edges.size(); ++i) {
            parent[i] = i;
        }
        for (auto& edge : edges){
            int node1 = edge[0],node2 = edge[1];
            if (Find_Set(parent,node1) != Find_Set(parent,node2)){
                Union_Set(parent,node1,node2);
            } else{
                res.push_back(node1);
                res.push_back(node2);
            }
        }
        return res;
    }
};
//leetcode submit region end(Prohibit modification and deletion)
